﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using CONTROLADORA;
using MODELO;

namespace VISTA
{
    public partial class frmABMPermisos : FormABMBase
    {
        
        dtsPermisos dtsABM;
        dtsPermisos.PermisoRow abmRow;

        Permisos controladora = new Permisos();
        Acciones controladoraAcciones = new Acciones();
        Formularios controladoraFormularios = new Formularios();

        public frmABMPermisos()
            : base()
        {
            InitializeComponent();
        }

        public frmABMPermisos(ModoABM modo, int id)
            : base(modo, id)
        {
            InitializeComponent();
        }


        protected override void InicializarControles()
        {
            
        }

        protected override void CargarEntidad()
        {
            dtsABM = controladora.GetPermisoPorID(ID);
            if (dtsABM != null && dtsABM.Permiso.Count != 0)
            {
                abmRow = dtsABM.Permiso[0];
                this.txtNombre.Text = abmRow.Nombre;
                this.cmbFor.SelectedValue = abmRow.ID_Formulario;
            }
            this.CargarAcciones();
        }

        private void CargarAcciones()
        {
            foreach (dtsPermisos.Permiso_AccionRow permisoAccionRow in dtsABM.Permiso_Accion.Rows)
            {
                if (permisoAccionRow.ID_Accion == 1)
                {
                    this.chkFull.Checked = true;
                }
                if (permisoAccionRow.ID_Accion == 2)
                {
                    this.chkLectura.Checked = true;
                }
                if (permisoAccionRow.ID_Accion == 3)
                {
                    this.chkImpresion.Checked = true;
                }
                if (permisoAccionRow.ID_Accion == 4)
                {
                    this.chkExportacion.Checked = true;
                }
                if (permisoAccionRow.ID_Accion == 5)
                {
                    this.chkEscritura.Checked = true;
                }
            }
        }

        protected override void CrearEntidad()
        {
            dtsABM = new dtsPermisos();
            dtsABM.Formulario.Merge(controladoraFormularios.GetFormularios().Formulario);
            dtsABM.Accion.Merge(controladoraAcciones.GetAcciones().Accion);

            abmRow = dtsABM.Permiso.NewPermisoRow();
        }


        protected override void GuardarEntidad()
        {
            switch (this.Modo)
            {
                case ModoABM.Alta:
                    this.RefrezcarCambios();
                    dtsABM.Permiso.AddPermisoRow(abmRow);
                    this.GenerarAcciones();
                    break;
                case ModoABM.Modificar:
                    this.RefrezcarCambios();
                    this.GenerarAcciones();
                    break;
                case ModoABM.Eliminar:
                    abmRow.Delete();
                    break;
                case ModoABM.Consultar:
                    break;
                default:
                    break;
            }

            try
            {
                controladora.GuardarEntidad(dtsABM);
            }
            catch (Exception ex)
            {
                if (ex.Message.Contains("DELETE"))
                {
                    MessageBox.Show("El Permiso no se puede eliminar debido a que está asignado a uno o más Grupos.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else if (ex.Message.Contains("MODIFY"))
                {
                    MessageBox.Show("El Permiso no se puede modificar.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }

        private void RefrezcarCambios()
        {
            abmRow.Nombre = this.txtNombre.Text;
            abmRow.ID_Formulario = (int)this.cmbFor.SelectedValue;

        }

        private void GenerarAcciones()
        {
            this.GenerarAccion(this.chkFull, this.dtsABM.Accion.FindByID_Accion(1));
            this.GenerarAccion(this.chkLectura, this.dtsABM.Accion.FindByID_Accion(2));
            this.GenerarAccion(this.chkImpresion, this.dtsABM.Accion.FindByID_Accion(3));
            this.GenerarAccion(this.chkExportacion, this.dtsABM.Accion.FindByID_Accion(4));
            this.GenerarAccion(this.chkEscritura, this.dtsABM.Accion.FindByID_Accion(5));
        }

        private void GenerarAccion(CheckBox checkBox, dtsPermisos.AccionRow rowAccion)
        {
            dtsPermisos.Permiso_AccionRow permisoAccion = null;
            DataRow[] dr = dtsABM.Permiso_Accion.Select("ID_Accion = " + rowAccion.ID_Accion.ToString());
            if (dr.Length != 0)
            {
                permisoAccion = (dtsPermisos.Permiso_AccionRow)dr[0];
            }

            if (checkBox.Checked)
            {
                if (permisoAccion == null)
                {
                    dtsABM.Permiso_Accion.AddPermiso_AccionRow(abmRow, rowAccion);
                }
                else if (permisoAccion.RowState == DataRowState.Deleted)
                {
                    permisoAccion.AcceptChanges();
                    permisoAccion.SetAdded();
                }
            }
            else
            {
                if (permisoAccion != null)
                {
                    permisoAccion.Delete();
                }
            }
        }


        private void btnAceptar_Click(object sender, EventArgs e)
        {
            if (this.validationProvider.Validate())
            {
                base.EjecutarAccion(AccionABM.Guardar);
            }
            else
            {
                this.validationProvider.ValidationMessages(true);
            }
        }

        private void btnCan_Click(object sender, EventArgs e)
        {
            this.Close();
        }


    }
}